package Modelo;

import java.io.Serializable;

import javax.persistence.*;


/**
 * The persistent class for the usuario database table.
 * 
 */

@Entity(name="usuario")
@NamedQueries({
	@NamedQuery(name="Usuario.findAll", query="SELECT u FROM usuario u"),
	@NamedQuery(name="Usuario.findByNif", query="SELECT u FROM usuario u WHERE u.nif=:nif "),
})


public class Usuario implements Serializable, IUsuario {
	private static final long serialVersionUID = 1L;
	
	@Id
	@SequenceGenerator(name="USUARIO_IDUSUARIO_GENERATOR", sequenceName="BD")
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="USUARIO_IDUSUARIO_GENERATOR")
	@Column(name="id_usuario", updatable=false, unique=true, nullable=false)
	private int idUsuario;

	@Column(name="nombre", nullable=false, length=250)
	private String nombre;
	
	@Column(name="apellidos",nullable=false, length=250)
	private String apellidos;
	
	
	
	@Column(name="nif",nullable=false, length=9)
	private String nif;

	@Column(name="email", nullable=false, length=250)
	private String email;
	
	//Constructores
	public Usuario (){	
	}

	public Usuario(String nombre,String apellidos, String email) throws Exception{
	
		this.setNombre(nombre);
		this.setApellidos(apellidos);
		this.setEmail(email);	
	}
	

	//Getter and Setter
	public int getIdUsuario() {
		return this.idUsuario;
	}

	public void setIdUsuario(int idUsuario) {
		this.idUsuario = idUsuario;
	}
	
	public String getNombre() {
		return this.nombre;
	}
	
	public void setNombre(String nombre) throws Exception {
		if(nombre==null || nombre.length() < 1 || nombre.length()>75)
			throw new Exception("El nombre debe tener entre 1 y 75 caracteres.");
		else
			this.nombre=nombre;
	}

	public String getApellidos() {
		return this.apellidos;
	}

	public void setApellidos(String apellidos) throws Exception {
		if(apellidos==null || apellidos.length() < 1 || apellidos.length()>150)
			throw new Exception("Los apellidos debe tener entre 1 y 150 caracteres.");
		else
			this.apellidos=apellidos;
	}
	
	public String getNif() {
		return this.nif;
	}

	public void setNif(String nif) throws Exception {
		if(nif.toUpperCase().matches("^[0-9]{8}[a-zA-Z]{1}$")){
	         if(nif.toUpperCase().charAt(8)==(this.calcularLetraNif(Integer.parseInt(nif.substring(0,8)))))
	            this.nif=nif.toUpperCase();
	         else
	            throw new Exception("Letra del DNI Incorrecta.");
	      }
	      else
	         throw new Exception("El formato del DNI es incorrecto.");
	}

	public String getEmail() {
		return this.email;
	}

	public void setEmail(String email) throws Exception {
		if(email.matches("^.+@.+\\..+$"))
			this.email=email;
	    else
	    	throw new Exception("El formato del email es incorrecto.");
	}
	
	private char calcularLetraNif(int nif){
		String juegoCaracteres="TRWAGMYFPDXBNJZSQVHLCKET";
	    int modulo= nif % 23;
	    char letra = juegoCaracteres.charAt(modulo);
	    return letra;
	}

}